/*****************************************************************************
文 件 名: main.c
描    述: 本程序包含1.6代气象站，1.5代墒情站，1.6代墒情站，1.5代多铜环四种程序
          程序全部基于1.5代板
          编译时通过控制宏定义来控制编译结果
作    者: 武玉峰
版    本: 1.0
完成日期: 2016.8.19
修改历史: 
*****************************************************************************/
//在工程选项 c/c++ 选项卡中 定义下列预编译符号之一
//#define WEATHER_STATION_1_6         //1.6代气象站
//#define SOIL_MOISTURE_STATION_1_5   //1.5代墒情站
//#define SOIL_MOISTURE_STATION_1_6   //1.6代墒情站
//#define MULTI_POLE_1_5            //1.5代多铜环 
#include "config.h"
#include "gpio.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
#include "string.h"
#include "stdlib.h"
#include "adc.h"
#include "24cxx.h"
#include "rs485.h"
#include "wdg.h"
#include "rtc.h"
#include "gprs.h"

#include "work.h"
#include "stmflash.h"
#include "fireware_update_extr.h"

//0初始模式 1配置模式 2 工作模式 
u8               _WorkPattern = 0;  

//用于计算超时时间的计数器
extern u16       _TimeOutCount; 

//系统采集时间
extern u16       _collectInterval;

extern u16       _CurVersion  ;

extern u8        _IMEI[16];

extern Config  _Config;


 

/*************************************************
函数名称: main
功    能: 主程序
参    数: 无 
返 回 值: 无
*************************************************/
int main(void)
{
    int r = 0; 
	
 
 		//看门狗初始化，分频数为256,重载值为625,溢出时间为4s
    //IWDG_Init(6,625);  
start:
	  //将中断重映射到0x1000
 
	  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
	  
	
	  //设置NVIC中断分组2：2位抢占优先级，2位响应优先级
		NVIC_Configuration(); 
	 
			//实时时钟初始化
	  RTC_Init();	
	
	

		
		  //延时函数初始化
	  delay_init();	

		 
		    //定时器3初始化  
    TIM3_Int_Init(4999, 3599); //10Khz的计数频率，计数到5000为500ms
		
     //IO端口初始化	   
    IO_Init();		

	
  //打开电源 
	 RELAY=1;
		
 
		DelayHalfSecond(6);
		
   
		//串口初始化为9600
	  uart_init(9600);	 
		 
    //IIC初始化
    AT24CXX_Init();			
		
    //485初始化（USART2）
    RS485_Init(9600);
		
		//ADC初始化
		Adc_Init();		  		
		 
		//电源灯亮
    PWRLED = 0; 
		
		//第二第三灯灭
    NETLED = CONLED = 1; 
		
		

		

 
 		
		//在USART3中断处理中，通过判断串口是否接收到特定的数据
		//来决定工作模式，_WorkPattern:0初始模式 1配置模式 2 工作模式 
		_WorkPattern = 0;
    _TimeOutCount = 0;		
     while(_WorkPattern == 0)
     {			  
         IWDG_Feed();
         if(_TimeOutCount > 10)
         {
					   //5秒内未接收到特定数据，进入工作模式
             _WorkPattern = 2;					 
             break;
         }
     }

		DebugOut("WorkPattern:%d\r\n", _WorkPattern);
    //DebugOut("WorkPattern:%d\r\n", _WorkPattern);
    if(_WorkPattern == 2)
    {
					//从flash 中加载配置
		    LoadConfig();
        //进入工作模式
        DebugOut("Enter work pattern\r\n");			
        WorkHandler();
        while(1);		
    }
    else if(_WorkPattern == 1)
    {
					//从flash 中加载配置
		   LoadConfig();
        //进入配置模式
        DebugOut("I am ready\r\n");
        r = ConfigHandler();
        DebugOut("config pattern returned:%d\r\n", r);
        if(r == 0) goto start;
    }
		
}//main





